package com.hzy.service.document;

import io.vertx.core.Promise;
import io.vertx.core.Vertx;
import io.vertx.core.eventbus.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.function.Function;

public interface DocumentVerticle {

    Logger LOGGER = LoggerFactory.getLogger(DocumentVerticle.class);


    String ADD_DOCUMENT_ADDRESS = "document.add";
    String GET_DOCUMENT_BY_ID_ADDRESS = "document.get.by.id";
    String SEARCH_DOCUMENTS_ADDRESS = "document.search"; // 用于RAG检索ES


    /**
     * 通用方法：注册 Event Bus 消费者，并处理异步操作的回调。
     * 这是一个默认方法，因此实现类无需重新实现，但会继承此行为。
     *
     * @param vertx         Vertx 实例，用于访问 Event Bus
     * @param address       Event Bus 地址
     * @param serviceMethod 一个函数，接受消息体 T，并返回一个 Promise<R> (表示异步操作的结果)
     * @param <T>           消息体的类型
     * @param <R>           异步操作结果的类型
     */
    default <T, R> void registerServiceConsumer(Vertx vertx, String address, Function<T, Promise<R>> serviceMethod) {
        vertx.eventBus().consumer(address, (Message<T> message) -> {
            try {
                T body = message.body();
                if (body == null) {
                    LOGGER.warn("Received null message body for address: {}", address);
                    message.fail(400, "Message body cannot be null.");
                    return;
                }

                serviceMethod.apply(body) // 调用服务方法，它返回一个 Promise<R>
                        .future()   // 获取 Promise 对应的 Future
                        .onSuccess(message::reply) // 成功时回复消息
                        .onFailure(throwable -> { // 失败时发送失败消息
                            LOGGER.error("Error processing message for address {}: {}", address, throwable.getMessage(), throwable);
                            message.fail(500, throwable.getMessage());
                        });
            } catch (ClassCastException e) {
                // 如果消息体类型与期望不符，记录错误并发送失败消息
                LOGGER.error("Invalid message body type for address {}: Expected {}, got {}", address, serviceMethod.getClass().getName(), message.body().getClass().getName(), e);
                message.fail(400, "Invalid message body type.");
            } catch (Exception e) {
                // 捕获在调用 serviceMethod.apply(body) 过程中可能发生的其他异常
                LOGGER.error("Unexpected error in consumer for address {}: {}", address, e.getMessage(), e);
                message.fail(500, "Internal server error during message processing.");
            }
        });
    }
}
